uint16_t crcRX = sbuf[len - 2] | sbuf[len - 1] << 8;
uint16_t crcCalculate = CRC16( sbuf, len - 2 );
if ( crcRX != crcCalculate ) {
if ( rdORNOfull ) rdORNOfull--; // licznik kompletu danych
sprintf( txt, ANSI_PEN_RED"\n\rCRC Error! Wyliczone %x otrzymane %x"ANSI_PEN_WHITE, crcCalculate, crcRX ); printDebug( txt );
LedFlash( LED_R, 500 );
}
else {
if ( rdORNOfull < LICZBA_PYTAN_ORNO * 2 ) rdORNOfull++;
timeoutAskOrno = millis() + TIM_OFLINE_ORNO;
printDebugModbus( ANSI_PEN_GREEN"\n\rCRC OK"ANSI_PEN_WHITE );
LedFlash( LED_Y, 50 );
if ( sbuf[1] != 3 ) {
printDebug( ANSI_PEN_RED"\n\r Odrzucono ze wzgledu na kod funkcji."ANSI_PEN_WHITE );
return;
}
if ( typOrno == 514 ) {
switch ( nrPytaniaOrno ) {
case 0: // Pytanie o napiecie
Napiecie = sbuf[3] << 8 | sbuf[4];
sprintf( txt, "\n\rNapiecie=%d,%02d ", Napiecie / 100, Napiecie % 100 ); printDebugModbus( txt );
break;
case 1: // Pytanie o prad
Prad = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6];
sprintf( txt, "Prad=%d,%03d ", Prad / 1000, Prad % 1000 ); printDebugModbus( txt );
break;
case 2: // Pytanie o moc czynna
MocCzynna = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6];
sprintf( txt, "MocCzynna=%d,%03d ", MocCzynna / 1000, MocCzynna % 1000 ); printDebugModbus( txt );
if ( MocCzynna > MAX_MOC_CZYNNA ) printDebugModbus( "\n\r********* Bzdurna moc czynna !!!!!!!!!\n\r" );
#ifndef MODBUS_HEX_ALL
if ( MocCzynna > MAX_MOC_CZYNNA )
#endif
{
fl_bzdura = len;
if ( fl_bzdura > LEN_ODP_ORNO ) fl_bzdura = LEN_ODP_ORNO;
memcpy( BufOdpOrno, sbuf, len ); // Kopia odebranej ramki
stModbus = MocCzynna;
}
break;
case 3: // Pytanie o moc bierna
MocBierna = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6];
sprintf( txt, "MocBierna=%d,%03d ", MocBierna / 1000, MocBierna % 1000 ); printDebugModbus( txt );
break;
case 4: // Pytanie o PF
WspolczynnikMocy = sbuf[3] << 8 | sbuf[4];
sprintf( txt, "WspolczynnikMocy=%d,%03d ", WspolczynnikMocy / 1000, WspolczynnikMocy % 1000 ); printDebugModbus( txt );
break;
case 5: // Pytanie o zuzyta energie czynna
EnergiaCzynna = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6]; // Total, kolejne UINT32 to taryfy T1, T2, T3 i T4
sprintf( txt, "EnergiaCzynnaa=%d,%03d ", EnergiaCzynna / 1000, EnergiaCzynna % 1000 ); printDebugModbus( txt );
break;
case 6: // Pytanie o zuzyta energie bierna
EnergiaBierna = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6]; // Total, kolejne UINT32 to taryfy T1, T2, T3 i T4
sprintf( txt, "EnergiaBierna=%d,%03d ", EnergiaBierna / 1000, EnergiaBierna % 1000 ); printDebugModbus( txt );
break;
case 7: // Pytanie o moc pozorna
MocPozorna = sbuf[3] << 24 | sbuf[4] << 16 | sbuf[5] << 8 | sbuf[6];
sprintf( txt, "MocPozorna=%d,%03d ", MocPozorna / 1000, MocPozorna % 1000 ); printDebugModbus( txt );
break;
case 8: // Pytanie o czestotliwosc
Czestotliwosc = sbuf[3] << 8 | sbuf[4];
sprintf( txt, "Czestotliwosc=%d,%02d ", Czestotliwosc / 100, Czestotliwosc % 100 ); printDebugModbus( txt );
break;
}
}
else {
//0 Napięcie (0,1V),
//1 Natężenie (0,1A),
//2 Częstotliwość (0,1Hz),
//3 Moc czynna (1W),
//4 Moc bierna (1var),
//5 Moc pozorna (1VA),
//6 Współczynnik mocy (1000),
//7 i 8 Energia czynna (1Wh), Decimal Long - little endian
//9 i A Energia bierna (1varh), Decimal Long - little endian
// Rejestr 0 (buf = 0*2+3=3)
Napiecie = sbuf[3] << 8 | sbuf[4]; Napiecie *= 10;
sprintf( txt, "\n\rNapiecie=%d,%02d ", Napiecie / 100, Napiecie % 100 ); printDebugModbus( txt );
// Rejestr 1 (buf = 1*2+3=5)
Prad = sbuf[5] << 8 | sbuf[6]; Prad *= 100;
sprintf( txt, "Prad=%d,%03d ", Prad / 1000, Prad % 1000 ); printDebugModbus( txt );
Czestotliwosc = sbuf[7] << 8 | sbuf[8]; Czestotliwosc *= 10;
sprintf( txt, "Czestotliwosc=%d,%02d ", Czestotliwosc / 100, Czestotliwosc % 100 ); printDebugModbus( txt );
MocCzynna = sbuf[9] << 8 | sbuf[10];
sprintf( txt, "MocCzynna=%d,%03d ", MocCzynna / 1000, MocCzynna % 1000 ); printDebugModbus( txt );
MocBierna = sbuf[11] << 8 | sbuf[12];
sprintf( txt, "MocBierna=%d,%03d ", MocBierna / 1000, MocBierna % 1000 ); printDebugModbus( txt );
MocPozorna = sbuf[13] << 8 | sbuf[14];
sprintf( txt, "MocPozorna=%d,%03d ", MocPozorna / 1000, MocPozorna % 1000 ); printDebugModbus( txt );
// Rejestr 6 (buf = 6*2+3=15)
WspolczynnikMocy = sbuf[15] << 8 | sbuf[16];
sprintf( txt, "WspolczynnikMocy=%d,%03d ", WspolczynnikMocy / 1000, WspolczynnikMocy % 1000 ); printDebugModbus( txt );
// Rejestr 7+8 (buf = 7*2+3=17)
EnergiaCzynna = sbuf[17] << 24 | sbuf[18] << 16 | sbuf[19] << 8 | sbuf[20];
sprintf( txt, "EnergiaCzynnaa=%d,%03d ", EnergiaCzynna / 1000, EnergiaCzynna % 1000 ); printDebugModbus( txt );
// Rejestr 9+10 (buf = 9*2+3=21)
EnergiaBierna = sbuf[21] << 24 | sbuf[22] << 16 | sbuf[23] << 8 | sbuf[24];
sprintf( txt, "EnergiaBierna=%d,%03d ", EnergiaBierna / 1000, EnergiaBierna % 1000 ); printDebugModbus( txt );
// SN - Rejestr 11+12 (buf = 11*2+3=25)
// BAUD RATE - Rejestr 14 (buf = 14*2+3=31)
// ID - Rejestr 15 (buf = 15*2+3=33)
if ( rdORNOfull < LICZBA_PYTAN_ORNO ) rdORNOfull = LICZBA_PYTAN_ORNO;
if ( MocCzynna > MAX_MOC_CZYNNA ) printDebugModbus( ANSI_PEN_RED"\n\r********* Bzdurna moc czynna !!!!!!!!!"ANSI_PEN_WHITE );
#ifndef MODBUS_HEX_ALL
if ( MocCzynna > MAX_MOC_CZYNNA )
#endif
{
fl_bzdura = len;
if ( fl_bzdura > LEN_ODP_ORNO ) fl_bzdura = LEN_ODP_ORNO;
memcpy( BufOdpOrno, sbuf, len ); // Kopia odebranej ramki
}